#! /usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2020/12/23 23:33
# @Author : youngchaolin

''''''

'''
带参数的装饰器（精髓：在外面再套一层）
我们提前写好一个功能，让别人使用的时候就能够调用就能完成相应的功能
'''

# 应用示例：登录、计算函数的执行时间

# 添加日志，在什么时间调用什么函数，并将调用记录返回到对应函数名的文件中
import time
def login():
    print('登录逻辑')


# 再套一层，把函数名再传进去，作为路径参数
def logger(path):
    def wrapper(func):
        def inner(*args,**kwargs):
            ret=func(*args,**kwargs)
            with open(path,mode='a',encoding='utf-8') as f:
                msg='%s执行了%s'%(time.strftime('%Y-%m-%d %H:%M:%S'),func.__name__)
                f.write(msg+'\n')
            return ret
        return inner
    return wrapper

ret1=logger('login.log')
ret2=ret1(login)
# 执行被装装饰的函数login
ret2()

@logger('register.log')
def register():
    print('注册逻辑')
@logger('logout.log')
def logout():
    print('登出逻辑')
@logger('comment.log')
def comment():
    print('评论逻辑')
@logger('article.log')
def article():
    print('写文章逻辑')

# 调用
register()
logout()
comment()

# 带参数的装饰器的精髓
def xxx(*args):
    def wrapper(func):
        def inner(*args,**kwargs):
            ret=func(*args,**kwargs)
            return ret
        return inner
    return wrapper

# TODO
# 有100个函数，分别添加一个计算函数执行时间的装饰器
# 有时候需要计算时间，有时候不需要
# 希望通过修改一个变量，能控制这100个函数的装饰器是否执行
# def run_time(flag):
#     def wrapper(func):
#         # 如果flag为True，计算函数执行时间，否则不执行
#         def inner(*args,**kwargs):
#             start=time.time()
#             ret=func(*args,**kwargs)
#             end=time.time()
#             if flag:print('%s函数执行时间为：%.2f秒'%(func.__name__,(end-start)))
#             return ret
#         return inner
#     return wrapper

# 修改下，TODO
def run_time(flag):
    def wrapper(func):
        # 如果flag为True，计算函数执行时间，否则不执行
        if flag:
            def inner(*args,**kwargs):
                start=time.time()
                ret=func(*args,**kwargs)
                end=time.time()
                print('%s函数执行时间为：%.2f秒'%(func.__name__,(end-start)))
                return ret
        else:
            def inner(*args,**kwargs):
                ret=func(*args,**kwargs)
                return ret
        return inner
    return wrapper

@run_time(True)
def func1():
    time.sleep(2)
    print('func1')
@run_time(True)
def func2():
    time.sleep(2)
    print('func2')
@run_time(False)
def func3():
    time.sleep(2)
    print('func3')
@run_time(False)
def func4():
    time.sleep(2)
    print('func4')

# 调用
func1()
func2()
func3()
func4()

